home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Microsoft Programmer's Library
/
Microsoft Programmer's Library (CD-ROM Database)(125-099-008)(Version 1.1a)(CDRM 162100)(1989).iso
/
SAMPCODE
/
OS2SDK11
/
TK4
/
PMCAP
/
PMCAP2.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-20
|
18KB
|
559 lines
/*----------------------------------
PMCAP2.C -- Routines for PMCAP.C
----------------------------------*/
#define INCL_WIN
#define INCL_GPI
#define INCL_BITMAPFILEFORMAT
#include <os2.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "pmcap.h"
extern CHAR szClientClass [] ;
extern HAB hab ;
VOID CheckMenuItem (HWND hwndMenu, SHORT idItem, BOOL fCheck)
{
WinSendMsg (hwndMenu, MM_SETITEMATTR,
MPFROM2SHORT (idItem, TRUE),
MPFROM2SHORT (MIA_CHECKED, fCheck ? MIA_CHECKED : 0)) ;
}
VOID EnableMenuItem (HWND hwndMenu, SHORT idItem, BOOL fEnable)
{
WinSendMsg (hwndMenu, MM_SETITEMATTR,
MPFROM2SHORT (idItem, TRUE),
MPFROM2SHORT (MIA_DISABLED, fEnable ? 0 : MIA_DISABLED)) ;
}
VOID ErrorMessage (HWND hwnd, SHORT idError)
{
CHAR achString [80] ;
WinLoadString (hab, NULL, idError, sizeof achString, achString) ;
WinMessageBox (HWND_DESKTOP, hwnd, achString, szClientClass, 0,
MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE) ;
}
VOID AddItemToSysMenu (HWND hwndFrame)
{
static CHAR *szMenuText [2] = { NULL, "~Begin countdown" } ;
static MENUITEM mi [2] = {
MIT_END, MIS_SEPARATOR, 0, 0, NULL, NULL,
MIT_END, MIS_TEXT, 0, IDM_BEGIN, NULL, NULL
} ;
HWND hwndSysMenu, hwndSysSubMenu ;
MENUITEM miSysMenu ;
SHORT idSysMenu, sItem ;
hwndSysMenu = WinWindowFromID (hwndFrame, FID_SYSMENU) ;
idSysMenu = SHORT1FROMMR (WinSendMsg (hwndSysMenu,
MM_ITEMIDFROMPOSITION,
NULL, NULL)) ;
WinSendMsg (hwndSysMenu, MM_QUERYITEM,
MPFROM2SHORT (idSysMenu, FALSE),
MPFROMP (&miSysMenu)) ;
hwndSysSubMenu = miSysMenu.hwndSubMenu ;
for (sItem = 0 ; sItem < 2 ; sItem++)
WinSendMsg (hwndSysSubMenu, MM_INSERTITEM,
MPFROMP (mi + sItem),
MPFROMP (szMenuText [sItem])) ;
return ;
}
VOID SaveColorSettings (BOOL fSave, BOOL fSetMono)
{
static LONG clrTableDef [2 * SYSCLR_CSYSCOLORS] ;
static LONG clrTable [] = { SYSCLR_WINDOWSTATICTEXT, 0x000000,
SYSCLR_SCROLLBAR, 0xC0C0C0,
SYSCLR_BACKGROUND, 0xFFFFFF,
SYSCLR_ACTIVETITLE, 0x000000,
SYSCLR_INACTIVETITLE, 0xFFFFFF,
SYSCLR_MENU, 0xFFFFFF,
SYSCLR_WINDOW, 0xFFFFFF,
SYSCLR_WINDOWFRAME, 0x000000,
SYSCLR_MENUTEXT, 0x000000,
SYSCLR_WINDOWTEXT, 0x000000,
SYSCLR_TITLETEXT, 0xFFFFFF,
SYSCLR_ACTIVEBORDER, 0xA0A0A0,
SYSCLR_INACTIVEBORDER, 0xFFFFFF,
SYSCLR_APPWORKSPACE, 0xE0E0E0,
SYSCLR_HELPBACKGROUND, 0xFFFFFF,
SYSCLR_HELPTEXT, 0x000000,
SYSCLR_HELPHILITE, 0x000000 } ;
SHORT i ;
if (fSave)
for (i = 0 ; i < SYSCLR_CSYSCOLORS ; i++)
clrTableDef[2*i+1] = WinQuerySysColor (HWND_DESKTOP,
clrTableDef[2*i] = clrTable[2*i], 0L);
if (fSetMono)
WinSetSysColors (HWND_DESKTOP, 0L, LCOLF_INDRGB,
0L, 2 * SYSCLR_CSYSCOLORS, clrTable) ;
else
WinSetSysColors (HWND_DESKTOP, 0L, LCOLF_INDRGB,
0L, 2 * SYSCLR_CSYSCOLORS, clrTableDef) ;
return ;
}
VOID IncrementFilename (CHAR *pchName)
{
SHORT sIndex ;
for (sIndex = strlen (pchName) - 1 ; sIndex >= 0 ; sIndex--)
{
if (pchName [sIndex] == '\\') // past filename
return ;
if (isdigit (pchName [sIndex]))
break ;
}
for ( ; sIndex >= 0 ; sIndex--)
{
if (!isdigit (pchName [sIndex]))
return ;
if (pchName [sIndex] == '9')
pchName [sIndex] = '0' ;
else
{
pchName [sIndex] += '\001' ;
return ;
}
}
return ;
}
HBITMAP CopyBitmap (HBITMAP hbmSrc)
{
BITMAPINFOHEADER bmp ;
HBITMAP hbmDst ;
HDC hdcSrc, hdcDst ;
HPS hpsSrc, hpsDst ;
POINTL aptl[3] ;
SIZEL sizl ;
hdcSrc = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
hdcDst = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
sizl.cx = sizl.cy = 0 ;
hpsSrc = GpiCreatePS (hab, hdcSrc, &sizl, PU_PELS | GPIF_DEFAULT |
GPIT_MICRO | GPIA_ASSOC) ;
hpsDst = GpiCreatePS (hab, hdcDst, &sizl, PU_PELS | GPIF_DEFAULT |
GPIT_MICRO | GPIA_ASSOC) ;
GpiQueryBitmapParameters (hbmSrc, &bmp) ;
hbmDst = GpiCreateBitmap (hpsDst, &bmp, 0L, NULL, NULL) ;
if (hbmDst != NULL)
{
GpiSetBitmap (hpsSrc, hbmSrc) ;
GpiSetBitmap (hpsDst, hbmDst) ;
aptl[0].x = aptl[0].y = 0 ;
aptl[1].x = bmp.cx ;
aptl[1].y = bmp.cy ;
aptl[2] = aptl[0] ;
GpiBitBlt (hpsDst, hpsSrc, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE) ;
}
GpiDestroyPS (hpsSrc) ;
GpiDestroyPS (hpsDst) ;
DevCloseDC (hdcSrc) ;
DevCloseDC (hdcDst) ;
return hbmDst ;
}
VOID CopyPointerToScreen (HPS hpsScreen, LONG alBitmapFormats[], BOOL fCopy)
{
static HBITMAP hbm ;
static HDC hdcMemory ;
static HPS hpsMemory ;
static POINTERINFO ptri ;
static POINTL ptlPointer, aptl[3] ;
static SHORT cxPointer, cyPointer ;
BITMAPINFOHEADER bmp ;
HPOINTER hptr ;
SIZEL sizl ;
if (WinQuerySysValue (HWND_DESKTOP, SV_MOUSEPRESENT) == 0L)
return ;
if (fCopy)
{
// Get Pointer Information
cxPointer = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CXPOINTER) ;
cyPointer = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CYPOINTER) ;
hptr = WinQueryPointer (HWND_DESKTOP) ;
WinQueryPointerInfo (hptr, &ptri) ;
WinQueryPointerPos (HWND_DESKTOP, &ptlPointer) ;
// Create memory DC and PS
hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
sizl.cx = sizl.cy = 0 ;
hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl,
PU_PELS | GPIF_DEFAULT |
GPIT_MICRO | GPIA_ASSOC) ;
// Create bitmap for destination
bmp.cbFix = sizeof bmp ;
bmp.cx = cxPointer ;
bmp.cy = cyPointer ;
bmp.cPlanes = (USHORT) alBitmapFormats[0] ;
bmp.cBitCount = (USHORT) alBitmapFormats[1] ;
hbm = GpiCreateBitmap (hpsMemory, &bmp, 0L, NULL, NULL) ;
// Copy from screen to bitmap
GpiSetBitmap (hpsMemory, hbm) ;
aptl[0].x = 0 ;
aptl[0].y = 0 ;
aptl[1].x = cxPointer ;
aptl[1].y = cyPointer ;
aptl[2].x = ptlPointer.x - ptri.xHotspot ;
aptl[2].y = ptlPointer.y - ptri.yHotspot ;
GpiBitBlt (hpsMemory, hpsScreen, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE) ;
// Draw pointer on screen
WinDrawPointer (hpsScreen, (SHORT) aptl[2].x, (SHORT) aptl[2].y,
hptr, DP_NORMAL) ;
}
else
{
// Copy from bitmap to screen
aptl[0].x = ptlPointer.x - ptri.xHotspot ;
aptl[0].y = ptlPointer.y - ptri.yHotspot ;
aptl[1].x = aptl[0].x + cxPointer ;
aptl[1].y = aptl[0].y + cyPointer ;
aptl[2].x = 0 ;
aptl[2].y = 0 ;
GpiBitBlt (hpsScreen, hpsMemory, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE) ;
// Clean up
GpiSetBitmap (hpsMemory, NULL) ;
GpiDestroyPS (hpsMemory) ;
DevCloseDC (hdcMemory) ;
GpiDeleteBitmap (hbm) ;
}
}
HBITMAP ScreenToBitmap (SHORT cxScreen, SHORT cyScreen, BOOL fIncludePtr,
BOOL fMonochrome)
{
BITMAPINFOHEADER bmp ;
HBITMAP hbm ;
HDC hdcMemory ;
HPS hpsScreen, hpsMemory ;
LONG alBitmapFormats [2] ;
POINTL aptl[3] ;
SIZEL sizl ;
// Create memory DC and PS
hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
sizl.cx = sizl.cy = 0 ;
hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl,
PU_PELS | GPIF_DEFAULT |
GPIT_MICRO | GPIA_ASSOC) ;
// Create bitmap for destination
bmp.cbFix = sizeof bmp ;
bmp.cx = cxScreen ;
bmp.cy = cyScreen ;
if (fMonochrome)
{
bmp.cPlanes = 1 ;
bmp.cBitCount = 1 ;
}
else
{
GpiQueryDeviceBitmapFormats (hpsMemory, 2L, alBitmapFormats) ;
bmp.cPlanes = (USHORT) alBitmapFormats[0] ;
bmp.cBitCount = (USHORT) alBitmapFormats[1] ;
}
hbm = GpiCreateBitmap (hpsMemory, &bmp, 0L, NULL, NULL) ;
// Copy from screen to bitmap
if (hbm != NULL)
{
GpiSetBitmap (hpsMemory, hbm) ;
hpsScreen = WinGetScreenPS (HWND_DESKTOP) ;
aptl[0].x = 0 ;
aptl[0].y = 0 ;
aptl[1].x = cxScreen ;
aptl[1].y = cyScreen ;
aptl[2].x = 0 ;
aptl[2].y = 0 ;
if (fIncludePtr)
CopyPointerToScreen (hpsScreen, alBitmapFormats, TRUE) ;
WinLockVisRegions (HWND_DESKTOP, TRUE) ;
GpiBitBlt (hpsMemory, hpsScreen, 3L, aptl,
fMonochrome ? ROP_NOTSRCCOPY : ROP_SRCCOPY, BBO_IGNORE) ;
WinLockVisRegions (HWND_DESKTOP, FALSE) ;
if (fIncludePtr)
CopyPointerToScreen (hpsScreen, alBitmapFormats, FALSE) ;
WinReleasePS (hpsScreen) ;
GpiDestroyPS (hpsMemory) ;
DevCloseDC (hdcMemory) ;
}
return hbm ;
}
BOOL IsBitmapMonoEGA (HBITMAP hbm)
{
BITMAPINFOHEADER bmp ;
if (hbm != NULL)
{
GpiQueryBitmapParameters (hbm, &bmp) ;
if (bmp.cx == 640 &&
bmp.cy == 350 &&
bmp.cPlanes == 1 &&
bmp.cBitCount == 1)
return TRUE ;
}
return FALSE ;
}
SHORT SaveBitmap (HBITMAP hbm, CHAR *szFilename)
{
BITMAPFILEHEADER bfh ;
BITMAPINFO *pbmi ;
BYTE *pbScan ;
FILE *file ;
HDC hdcMemory ;
HPS hpsMemory ;
LONG lBmpDataSize ;
SHORT sRgbTableSize, sScanLineSize, sScan ;
SIZEL sizl ;
// Get bitmap information
bfh.bmp.cbFix = sizeof (BITMAPINFOHEADER) ;
GpiQueryBitmapParameters (hbm, &bfh.bmp) ;
if (bfh.bmp.cPlanes != 1)
return IDS_MULTIPLANE ;
sRgbTableSize = (1 << bfh.bmp.cPlanes * bfh.bmp.cBitCount) * sizeof (RGB);
sScanLineSize = ((bfh.bmp.cBitCount * bfh.bmp.cx + 31) / 32) * 4 *
bfh.bmp.cPlanes ;
lBmpDataSize = (LONG) sScanLineSize * bfh.bmp.cy ;
// Open file
if (NULL == (file = fopen (szFilename, "wb")))
return IDS_FILEOPEN ;
// Set up file header and write it to file
bfh.usType = BFT_BMAP ;
bfh.cbSize = sizeof (BITMAPFILEHEADER) + sRgbTableSize + lBmpDataSize ;
bfh.xHotspot = 0 ;
bfh.yHotspot = 0 ;
bfh.offBits = sizeof (BITMAPFILEHEADER) + sRgbTableSize ;
fwrite (&bfh, sizeof bfh, 1, file) ;
// Create memory DC and PS, and set bitmap in it
hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
sizl.cx = sizl.cy = 0 ;
hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl, PU_PELS | GPIF_DEFAULT |
GPIT_MICRO | GPIA_ASSOC) ;
GpiSetBitmap (hpsMemory, hbm) ;
// Allocate memory for BITMAPINFO table & scans
pbmi = malloc (sizeof (BITMAPINFOHEADER) + sRgbTableSize) ;
pbmi->cbFix = sizeof (BITMAPINFOHEADER) ;
pbmi->cPlanes = bfh.bmp.cPlanes ;
pbmi->cBitCount = bfh.bmp.cBitCount ;
pbScan = malloc (sScanLineSize) ;
// Loop through scan lines
for (sScan = 0 ; sScan < bfh.bmp.cy ; sScan++)
{
GpiQueryBitmapBits (hpsMemory, (LONG) sScan, 1L, pbScan, pbmi) ;
if (sScan == 0)
fwrite (&pbmi->argbColor[0], sRgbTableSize, 1, file) ;
if (fwrite (pbScan, sScanLineSize, 1, file) == 0)
break ;
}
// Cleanup after completion
fclose (file) ;
free (pbmi) ;
free (pbScan) ;
GpiDestroyPS (hpsMemory) ;
DevCloseDC (hdcMemory) ;
if (sScan != bfh.bmp.cy)
{
unlink (szFilename) ;
return IDS_DISKFULL ;
}
return 0 ;
}
typedef struct
{
SHORT key1 ;
SHORT key2 ;
SHORT dxFile ;
SHORT dyFile ;
SHORT ScrAspectX ;
SHORT ScrAspectY ;
SHORT PrnAspectX ;
SHORT PrnAspectY ;
SHORT dxPrinter ;
SHORT dyPrinter ;
SHORT AspCorX ;
SHORT AspCorY ;
SHORT wCheck ;
SHORT res1 ;
SHORT res2 ;
SHORT res3 ;
SHORT bitmap[350][40] ;
}
PAINT ;
SHORT SavePaintFormat (HBITMAP hbm, CHAR *szFilename)
{
BITMAPINFO *pbmi ;
FILE *file ;
HDC hdcMemory ;
HPS hpsMemory ;
PAINT *ppaint ;
SHORT i, j, sHold, sWrite ;
SIZEL sizl ;
// Allocate memory and open file
if (!IsBitmapMonoEGA (hbm))
return IDS_MONOEGA ;
if (NULL == (ppaint = malloc (sizeof (PAINT))))
return IDS_MEMORY ;
if (NULL == (file = fopen (szFilename, "wb")))
{
free (ppaint) ;
return IDS_FILEOPEN ;
}
// Set up Paint header for EGA
ppaint->key1 = 0x6144 ;
ppaint->key2 = 0x4D6E ;
ppaint->dxFile = 0x0280 ;
ppaint->dyFile = 0x015E ;
ppaint->ScrAspectX = 0x0026 ;
ppaint->ScrAspectY = 0x0030 ;
ppaint->PrnAspectX = 0x0026 ;
ppaint->PrnAspectY = 0x0030 ;
ppaint->dxPrinter = 0x0280 ;
ppaint->dyPrinter = 0x015E ;
ppaint->AspCorX = 0x0000 ;
ppaint->AspCorY = 0x0000 ;
ppaint->wCheck = 0x2C2A ;
ppaint->res1 = 0xB80E ;
ppaint->res2 = 0x0050 ;
ppaint->res3 = 0x8D50 ;
// Create memory DC and PS, and set bitmap in it
hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
sizl.cx = sizl.cy = 0 ;
hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl, PU_PELS | GPIF_DEFAULT |
GPIT_MICRO | GPIA_ASSOC) ;
GpiSetBitmap (hpsMemory, hbm) ;
// Allocate memory for bitmap header info
pbmi = malloc (sizeof (BITMAPINFO) + sizeof (RGB)) ;
pbmi->cbFix = sizeof (BITMAPINFOHEADER) ;
pbmi->cx = 640 ;
pbmi->cy = 350 ;
pbmi->cPlanes = 1 ;
pbmi->cBitCount = 1 ;
// Get bitmap bits
GpiQueryBitmapBits (hpsMemory, 0L, 350L, (PBYTE) ppaint->bitmap, pbmi) ;
free (pbmi) ;
// Convert to paint format and write
for (i = 0 ; i < 350 / 2 ; i++)
for (j = 0 ; j < 40 ; j++)
{
sHold = ~ppaint->bitmap[i][j] ;
ppaint->bitmap[i][j] = ~ppaint->bitmap[350-i-1][j] ;
ppaint->bitmap[350-i-1][j] = sHold ;
}
sWrite = fwrite (ppaint, sizeof (PAINT), 1, file) ;
// Clean up after completion
fclose (file) ;
free (ppaint) ;
GpiDestroyPS (hpsMemory) ;
DevCloseDC (hdcMemory) ;
if (sWrite == 0)
{
unlink (szFilename) ;
return IDS_DISKFULL ;
}
return 0 ;
}